/***************************************************************************\
*
* Module Name: PMSHL.H
*
* OS/2 Presentation Manager Shell constants, types, messages and
* function declarations
*
* Copyright (c) 1989-1990, Microsoft Corporation.  All rights reserved.
*
* ===========================================================================
*
* The following symbols are used in this file for conditional sections.
*
*   INCL_WINSHELLDATA    Include Presentation Manager profile calls
*   INCL_SHLERRORS       defined if INCL_ERRORS is defined
*   INCL_WINSWITCHLIST   Include Switch List Calls
*   INCL_WINPROGRAMLIST  Include Program List Calls
*
\***************************************************************************/

/* common types, constants and function declarations */

#ifndef PMSHL_COMMON_INCLUDED
#define PMSHL_COMMON_INCLUDED

/* maximum title length */
#define MAXNAMEL 60

/* window size structure */
typedef struct _XYWINSIZE {	/* xywin */
	SHORT x;
	SHORT y;
	SHORT cx;
	SHORT cy;
	USHORT fsWindow;
} XYWINSIZE;
typedef XYWINSIZE FAR *PXYWINSIZE;

/* Definitions for fsWindow */
#define XYF_NOAUTOCLOSE 	0x0008
#define XYF_MINIMIZED		0x0004
#define XYF_MAXIMIZED		0x0002
#define XYF_INVISIBLE		0x0001
#define XYF_NORMAL		0X0000

/* program handle */
typedef LHANDLE HPROGRAM;	/* hprog */
typedef HPROGRAM FAR * PHPROGRAM;

/* ini file handle */
typedef LHANDLE HINI;		/* hini */
typedef HINI FAR * PHINI;


#define HINI_PROFILE		(HINI) NULL
#define HINI_USERPROFILE	((HINI) -1L)
#define HINI_SYSTEMPROFILE	((HINI) -2L)

#define HINI_USER	HINI_USERPROFILE
#define HINI_SYSTEM	HINI_SYSTEMPROFILE

#endif /* PMSHL_COMMON_INCLUDED */

#if (defined(INCL_WINPROGRAMLIST) && !defined(INCL_WINPROGRAMLIST_INCLUDED))
#define INCL_WINPROGRAMLIST_INCLUDED
/* maximum path length */
#define MAXPATHL 128

/* root group handle */
#define SGH_ROOT	(HPROGRAM) (-1L)

typedef struct _HPROGARRAY {	/* hpga */
	HPROGRAM ahprog[1];
} HPROGARRAY;
typedef HPROGARRAY FAR *PHPROGARRAY;

typedef CHAR PROGCATEGORY;	/* progc */
typedef PROGCATEGORY FAR *PPROGCATEGORY;

/* values acceptable for PROGCATEGORY for PM groups */
#define PROG_DEFAULT		(PROGCATEGORY) 0
#define PROG_FULLSCREEN 	(PROGCATEGORY) 1
#define PROG_WINDOWABLEVIO	(PROGCATEGORY) 2
#define PROG_PM 		(PROGCATEGORY) 3
#define PROG_GROUP		(PROGCATEGORY) 5
#define PROG_REAL		(PROGCATEGORY) 4   /* was 7 */
#define PROG_DLL		(PROGCATEGORY) 6
#define PROG_RESERVED		(PROGCATEGORY) 255

/* visibility flag for PROGTYPE structure */
#define SHE_VISIBLE   (BYTE) 0x00
#define SHE_INVISIBLE (BYTE) 0x01
#define SHE_RESERVED  (BYTE) 0xFF

/* Protected group flag for PROGTYPE structure */
#define SHE_UNPROTECTED (BYTE) 0x00
#define SHE_PROTECTED	(BYTE) 0x02

typedef struct _PROGTYPE {	/* progt */
	PROGCATEGORY progc;
	UCHAR	     fbVisible;
} PROGTYPE;
typedef PROGTYPE FAR *PPROGTYPE;

typedef struct _PROGRAMENTRY {	/* proge */
	HPROGRAM hprog;
	PROGTYPE progt;
	CHAR	 szTitle[MAXNAMEL+1];
} PROGRAMENTRY;
typedef PROGRAMENTRY FAR *PPROGRAMENTRY;

typedef struct _PIBSTRUCT {	/* pib */
	PROGTYPE  progt;
	CHAR	  szTitle[MAXNAMEL+1];
	CHAR	  szIconFileName[MAXPATHL+1];
	CHAR	  szExecutable[MAXPATHL+1];
	CHAR	  szStartupDir[MAXPATHL+1];
	XYWINSIZE xywinInitial;
	USHORT	  res1;
	LHANDLE   res2;
	USHORT	  cchEnvironmentVars;
	PCH	  pchEnvironmentVars;
	USHORT	  cchProgramParameter;
	PCH	  pchProgramParameter;
} PIBSTRUCT;
typedef  PIBSTRUCT FAR *PPIBSTRUCT;

/***************************************************************************/
/*                                                                            */
/*  Structures associated with 'Prf' calls                                    */
/*                                                                            */
/***************************************************************************/

typedef struct _PROGDETAILS { /* progde */
	ULONG	  Length;		/* set this to sizeof(PROGDETAILS) */
	PROGTYPE  progt;
	USHORT	  pad1[3];		/* ready for 32-bit PROGTYPE	   */
	PSZ	  pszTitle;		/* any of the pointers can be NULL */
	PSZ	  pszExecutable;
	PSZ	  pszParameters;
	PSZ	  pszStartupDir;
	PSZ	  pszIcon;
	PSZ	  pszEnvironment;	/* this is terminated by  /0/0	   */
	SWP	  swpInitial;		/* this replaces XYWINSIZE	   */
	USHORT	  pad2[5];		/* ready for 32-bit SWP 	   */
} PROGDETAILS;
typedef PROGDETAILS FAR *PPROGDETAILS;

typedef struct _PROGTITLE {	/* progti */
	HPROGRAM hprog;
	PROGTYPE progt;
	USHORT	 pad1[3];	/* padding ready for 32-bit PROGTYPE */
	PSZ	 pszTitle;
} PROGTITLE;
typedef PROGTITLE FAR *PPROGTITLE;

typedef struct _QFEOUTBLK {	/* qfeout */
	USHORT	 Total;
	USHORT	 Count;
	HPROGRAM ProgramArr[1];
} QFEOUTBLK;
typedef QFEOUTBLK far *PQFEOUTBLK;

/* Program List API Function Definitions */

/***  Program Use */

BOOL	APIENTRY WinQueryProgramTitles(HAB hab, HPROGRAM hprogGroup,
				       PPROGRAMENTRY aprogeBuffer,
				       USHORT usBufferLen, PUSHORT pusTotal);

/***  Single Program Manipulation */
HPROGRAM  APIENTRY WinAddProgram(HAB hab, PPIBSTRUCT ppibProgramInfo,
				 HPROGRAM hprogGroupHandle);

USHORT	APIENTRY WinQueryDefinition(HAB hab, HPROGRAM hprogProgHandle,
				    PPIBSTRUCT ppibProgramInfo,
				    USHORT usMaxLength);

/***  Group Manipulation */
HPROGRAM  APIENTRY WinCreateGroup(HAB hab, PSZ pszTitle , UCHAR ucVisibility,
				  ULONG flres1, ULONG flres2);
/***************************************************************************/
/*                                                                            */
/*  Program List API available 'Prf' calls                                    */
/*                                                                            */
/***************************************************************************/

ULONG APIENTRY PrfQueryProgramTitles(HINI hini, HPROGRAM hprogGroup,
				     PPROGTITLE pTitles, ULONG cchBufferMax,
				     PULONG pulCount);

/****************************************************************************/
/*									    */
/*  NOTE: string information is concatanated after the array of PROGTITLE   */
/*	  structures so you need to allocate storage greater than	    */
/*	  sizeof(PROGTITLE)*cPrograms to query programs in a group	    */
/*									    */
/*  PrfQueryProgramTitles recommended usage to obtain titles of all progams */
/*  in a group (Hgroup=SGH_ROOT is for all groups):			    */
/*									    */
/*  BufLen = PrfQueryProgramTitles(Hini, Hgroup,			    */
/*					     (PPROGTITLE) NULL, 0, &Count); */
/*									    */
/*  Alocate buffer of  Buflen						    */
/*									    */
/*  Len = PrfQueryProgramTitles(Hini, Hgroup, (PPROGTITLE)pBuffer, BufLen,  */
/*								   pCount); */
/*									    */
/****************************************************************************/

HPROGRAM APIENTRY PrfAddProgram(HINI hini, PPROGDETAILS pDetails,
				HPROGRAM hprogGroup);
BOOL	 APIENTRY PrfChangeProgram(HINI hini, HPROGRAM hprog,
				   PPROGDETAILS pDetails);

/***************************************************************************/
/*  when adding/changing programs the PROGDETAILS Length field should be   */
/*  set to sizeof(PROGDETAILS)                                             */
/***************************************************************************/

ULONG	 APIENTRY PrfQueryDefinition(HINI hini, HPROGRAM hprog,
				     PPROGDETAILS pDetails, ULONG cchBufferMax);

/****************************************************************************/
/*									    */
/*  NOTE: string information is concatanated after the PROGDETAILS field    */
/*	  structure so you need to allocate storage greater than	    */
/*	  sizeof(PROGDETAILS) to query programs 			    */
/*									    */
/*  PrfQueryDefinition recomended usage:				    */
/*									    */
/*  bufferlen = PrfQueryDefinition(Hini, Hprog, (PPROGDETAILS) NULL, 0)     */
/*									    */
/*  Alocate buffer of bufferlen bytes					    */
/*  set Length field (0 will be supported)				    */
/*									    */
/*  (PPROGDETAILS)pBuffer->Length=sizeof(PPROGDETAILS)			    */
/*									    */
/*  len = PrfQueryDefinition(Hini, Hprog, (PPROGDETAILS)pBuffer, bufferlen) */
/*									    */
/****************************************************************************/

BOOL	 APIENTRY PrfRemoveProgram(HINI hini, HPROGRAM hprog);
ULONG	 APIENTRY PrfQueryProgramHandle(HINI hini, PSZ pszExe,
					PHPROGARRAY phprogArray,
					ULONG cchBufferMax, PULONG pulCount);
HPROGRAM APIENTRY PrfCreateGroup(HINI hini, PSZ pszTitle, UCHAR chVisibility);
BOOL	 APIENTRY PrfDestroyGroup(HINI hini, HPROGRAM hprogGroup);
PROGCATEGORY APIENTRY PrfQueryProgramCategory(HINI hini, PSZ pszExe);

#endif /* INCL_WINPROGRAMLIST */

#if ((defined(INCL_WINSWITCHLIST) || !defined(INCL_NOCOMMON)) && !defined(INCL_WINSWITCHLIST_INCLUDED))
#define INCL_WINSWITCHLIST_INCLUDED

typedef LHANDLE HSWITCH;	/* hsw */
typedef HSWITCH FAR *PHSWITCH;

/* visibility flag for SWCNTRL structure */
#define SWL_VISIBLE   (BYTE) 0x04
#define SWL_INVISIBLE (BYTE) 0x01
#define SWL_GRAYED    (BYTE) 0x02

/* visibility flag for SWCNTRL structure */
#define SWL_JUMPABLE	(BYTE) 0x02
#define SWL_NOTJUMPABLE (BYTE) 0x01

typedef struct _SWCNTRL {	/* swctl */
	HWND	 hwnd;
	HWND	 hwndIcon;
	HPROGRAM hprog;
	USHORT	 idProcess;
	USHORT	 idSession;
	UCHAR	 uchVisibility;
	UCHAR	 fbJump;
	CHAR	 szSwtitle[MAXNAMEL+1];
	BYTE	 fReserved;	   /* To align on word boundary */
} SWCNTRL;
typedef SWCNTRL FAR *PSWCNTRL;

/*** Switching Program functions */
HSWITCH APIENTRY WinAddSwitchEntry(PSWCNTRL);
USHORT	APIENTRY WinRemoveSwitchEntry(HSWITCH);

#endif  /* not INCL_NOCOMMON */

#if (defined(INCL_WINSWITCHLIST) && !defined(INCL_WINSWITCHLIST_INCLUDED))
#define INCL_WINSWITCHLIST_INCLUDED

typedef struct _SWENTRY {	/* swent */
	HSWITCH hswitch;
	SWCNTRL swctl;
} SWENTRY;
typedef SWENTRY FAR *PSWENTRY;

typedef struct _SWBLOCK {	/* swblk */
	USHORT	 cswentry;
	SWENTRY aswentry[1];
} SWBLOCK;
typedef SWBLOCK FAR *PSWBLOCK;

USHORT	APIENTRY WinChangeSwitchEntry(HSWITCH hswitchSwitch,
				      PSWCNTRL pswctlSwitchData);
HSWITCH APIENTRY WinCreateSwitchEntry(HAB, PSWCNTRL);
USHORT	APIENTRY WinQuerySessionTitle(HAB hab, USHORT usSession,
				      PSZ pszTitle, USHORT usTitlelen);
USHORT	APIENTRY WinQuerySwitchEntry(HSWITCH hswitchSwitch,
				    PSWCNTRL pswctlSwitchData);
HSWITCH APIENTRY WinQuerySwitchHandle(HWND hwnd, PID usProcess);
USHORT	APIENTRY WinQuerySwitchList(HAB hab, PSWBLOCK pswblkSwitchEntries,
				    USHORT usDataLength);
USHORT	APIENTRY WinQueryTaskSizePos(HAB hab, USHORT usScreenGroup,
				     PSWP pswpPositionData);
USHORT	APIENTRY WinQueryTaskTitle(USHORT usSession, PSZ pszTitle,
				   USHORT usTitlelen);
USHORT	APIENTRY WinSwitchToProgram(HSWITCH hswitchSwHandle);

#endif

/* if error definitions are required then allow Shell errors */
#ifdef INCL_ERRORS
    #define INCL_SHLERRORS
#endif /* INCL_ERRORS */

#if (defined(INCL_WINSHELLDATA) && !defined(INCL_WINSHELLDATA_INCLUDED))
#define INCL_WINSHELLDATA_INCLUDED

/*** OS2.INI Access functions */
SHORT	APIENTRY WinQueryProfileInt(HAB hab, PSZ pszAppName,
				    PSZ pszKeyName, SHORT sDefault);
USHORT	APIENTRY WinQueryProfileString(HAB hab, PSZ pszAppName,
				       PSZ pszKeyName, PSZ pszDefault,
				       PVOID pProfileString,
				       USHORT usMaxPstring);
BOOL	APIENTRY WinWriteProfileString(HAB hab, PSZ pszAppName,
				       PSZ pszKeyName, PSZ pszValue);
USHORT	APIENTRY WinQueryProfileSize(HAB hab, PSZ pszAppName, PSZ pszKeyName,
				     PUSHORT pusValue);
BOOL	APIENTRY WinQueryProfileData(HAB hab, PSZ pszAppName, PSZ pszKeyName,
				     PVOID pValue, PUSHORT pusSize);
BOOL	APIENTRY WinWriteProfileData(HAB hab, PSZ pszAppName, PSZ pszKeyName,
				     PVOID pValue, USHORT usSize);

/***************************************************************************/
/*                                                                            */
/*  INI file access API available calls 'Prf'                                 */
/*                                                                            */
/***************************************************************************/

typedef struct _PRFPROFILE { /* prfpro */
	ULONG  cchUserName;
	PSZ    pszUserName;
	ULONG  cchSysName;
	PSZ    pszSysName;
} PRFPROFILE;
typedef PRFPROFILE FAR *PPRFPROFILE;

SHORT APIENTRY PrfQueryProfileInt(HINI hini, PSZ pszApp, PSZ pszKey,
				  SHORT sDefault);
ULONG APIENTRY PrfQueryProfileString(HINI hini, PSZ pszApp, PSZ pszKey,
				     PSZ pszDefault, PVOID pBuffer,
				     ULONG cchBufferMax);
BOOL  APIENTRY PrfWriteProfileString(HINI hini, PSZ pszApp, PSZ pszKey,
				     PSZ pszData);
BOOL  APIENTRY PrfQueryProfileSize(HINI hini, PSZ pszApp, PSZ pszKey,
				   PULONG pulReqLen);
BOOL  APIENTRY PrfQueryProfileData(HINI hini, PSZ pszApp, PSZ pszKey,
				   PVOID pBuffer, PULONG pulBuffLen);

BOOL  APIENTRY PrfWriteProfileData(HINI hini, PSZ pszApp, PSZ pszKey,
				   PVOID pData, ULONG cchDataLen);

HINI  APIENTRY PrfOpenProfile(HAB hab, PSZ pszFileName);
BOOL  APIENTRY PrfCloseProfile(HINI hini);
BOOL  APIENTRY PrfReset(HAB hab, PPRFPROFILE pPrfProfile);
BOOL  APIENTRY PrfQueryProfile(HAB hab, PPRFPROFILE pPrfProfile);

/* new public message, broadcast on PrfReset() */
#define PL_ALTERED 0x008E  /* WM_SHELLFIRST + 0E */

#endif /* INCL_WINSHELLDATA */

#if (defined(INCL_SHLERRORS) && !defined(INCL_SHLERRORS_INCLUDED))
#define INCL_SHLERRORS_INCLUDED

#include <pmerr.h>

#endif /* INCL_SHLERRORS */

typedef LHANDLE HAPP;

HAPP APIENTRY WinInstStartApp(HINI hini, HWND hwndNotifyWindow,
			      USHORT cCount, PSZ far * aszApplication,
			      PSZ pszCmdLine, PVOID pData, USHORT fsOptions);

BOOL APIENTRY WinTerminateApp(HAPP happ);

/* bit values for Options parameter of WinInstStartAppl */
#define SAF_INSTALLEDCMDLINE  0x0001 /* use installed parameters */
#define SAF_STARTCHILDAPP     0x0002 /* related application	 */
